package com.ssy.lingxi.platform.template.service.serviceimpl.paas;

import com.ssy.lingxi.common.constant.template.PageTemplateTypeEnum;
import com.ssy.lingxi.common.exception.BusinessException;
import com.ssy.lingxi.common.response.ResponseCode;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.platform.template.api.model.dto.paas.PageTemplatePAASDTO;
import com.ssy.lingxi.platform.template.service.constant.CommonBooleanEnum;
import com.ssy.lingxi.platform.template.service.entity.adorn.PageTemplate;
import com.ssy.lingxi.platform.template.service.repository.PageTemplateRepository;
import com.ssy.lingxi.platform.template.service.service.paas.PageTemplatePAASService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @menu 页面模板 - （系统初始化）PAAS接口 - 业务实现层
 * @author fhj
 * @version 2.0.0
 * @date 2020/11/21
 */
@Slf4j
@Service
public class PageTemplatePAASServiceImpl implements PageTemplatePAASService {

    @Resource
    private PageTemplateRepository pageTemplateRepository;

    @Override
    @Transactional
    @ApiOperation(value = "新增")
    public Wrapper<Void> add(PageTemplatePAASDTO dto) {
        PageTemplate pageTemplate = new PageTemplate();
        pageTemplate.setId(dto.getId());
        pageTemplate.setTemplateName(dto.getTemplateName());
        pageTemplate.setEnvironment(dto.getEnvironment());
        pageTemplate.setTemplateDescribe(dto.getTemplateDescribe());
        pageTemplate.setTemplatePicUrl(dto.getTemplatePicUrl());
        pageTemplate.setFileName(dto.getFileName());
        pageTemplate.setType(dto.getType());
        pageTemplate.setStatus(dto.getStatus());
        pageTemplate.setAllow(dto.getAllow());
        pageTemplate.setCreateTime(dto.getCreateTime());
        pageTemplateRepository.saveAndFlush(pageTemplate);
        return Wrapper.success();
    }

    @Override
    @Transactional
    @ApiOperation(value = "修改")
    public Wrapper<Void> update(PageTemplatePAASDTO dto) {
        PageTemplate pageTemplate = pageTemplateRepository.findById(dto.getId()).orElse(null);
        if(pageTemplate == null) {
            throw new BusinessException(ResponseCode.PT_NOT_FOUND_TEMPLATE);
        }
        pageTemplate.setTemplateName(dto.getTemplateName());
        pageTemplate.setTemplateDescribe(dto.getTemplateDescribe());
        pageTemplate.setTemplatePicUrl(dto.getTemplatePicUrl());
        pageTemplate.setFileName(dto.getFileName());
        pageTemplateRepository.saveAndFlush(pageTemplate);

        return Wrapper.success();
    }

    @Override
    @Transactional
    @ApiOperation(value = "使用")
    public Wrapper<Void> use(PageTemplatePAASDTO dto) {
        //根据ID获取模板详情
        PageTemplate pageTemplate = pageTemplateRepository.findById(dto.getId()).orElse(null);
        if(pageTemplate == null) {
            throw new BusinessException(ResponseCode.PT_NOT_FOUND_TEMPLATE);
        }

        //更新模板的站点ID、商城ID、站点名称、商城名称、商城类型、商城属性、模板使用状态、是否允许使用
        pageTemplate.setSiteId(dto.getSiteId());
        pageTemplate.setShopId(dto.getShopId());
        pageTemplate.setSiteName(dto.getSiteName());
        pageTemplate.setShopName(dto.getShopName());
        pageTemplate.setShopType(dto.getShopType());
        pageTemplate.setProperty(dto.getProperty());
        pageTemplate.setStatus(dto.getAllow());
        pageTemplate.setAllow(dto.getAllow());

        //如果为平台首页模板、企业商城模板、商品模板
        if(PageTemplateTypeEnum.checkStatusTemplate(dto.getType())){
            //将同站点同环境同类型的模板全部改为不可用，如果是企业商城还需加上同商城
            List<PageTemplate> pageTemplateList;
            if(dto.getType().equals(PageTemplateTypeEnum.MALL.getCode())) {
                pageTemplateList = pageTemplateRepository.findAllBySiteIdAndShopIdAndEnvironmentAndType(
                        dto.getSiteId(),
                        dto.getShopId(),
                        dto.getEnvironment(),
                        dto.getType()
                );
            }else {
                pageTemplateList = pageTemplateRepository.findAllBySiteIdAndEnvironmentAndType(
                        dto.getSiteId(),
                        dto.getEnvironment(),
                        dto.getType()
                );
            }
            //同时排除要修改的模板
            pageTemplateList.stream().filter(a -> !a.getId().equals(dto.getId())).forEach(a -> {
                a.setStatus(CommonBooleanEnum.NO.getCode());
                a.setAllow(CommonBooleanEnum.NO.getCode());
            });
            pageTemplateRepository.saveAll(pageTemplateList);
        }

        //更新模板
        pageTemplateRepository.saveAndFlush(pageTemplate);

        return Wrapper.success();
    }
}
